package designpattern.strategy.old;

import java.text.MessageFormat;

/**
 * @author zhaoqiankun
 * @since 2021-12-27 0:29
 * 策略模式（Strategy），就是⼀个问题有多种解决⽅案，选择其中的⼀种使⽤，这种情况下我们
 * 使⽤策略模式来实现灵活地选择，也能够⽅便地增加新的解决⽅案。⽐如做数学题，⼀个问题的
 * 解法可能有多种；再⽐如商场的打折促销活动，打折⽅案也有很多种，有些商品是不参与折扣活
 * 动要按照原价销售，有些商品打8.5折，有些打6折，有些是返现5元等。
 * 结构
 * 策略（Strategy）
 * 定义所有⽀持算法的公共接⼝。 Context 使⽤这个接⼝来调⽤某 ConcreteStrategy 定义的算法。
 * 策略实现（ConcreteStrategy）
 * 实现了Strategy 接⼝的具体算法
 * 上下⽂（Context）
 * 维护⼀个 Strategy 对象的引⽤
 * ⽤⼀个 ConcreteStrategy 对象来装配
 * 可定义⼀个接⼝⽅法让 Strategy 访问它的数据
 * 示例
 * 假如现在有⼀个商场优惠活动，有的商品原价售卖，有的商品打8.5折，有的商品打6折，有的返现
 * 5元
 */
public class BuyGoods {


    /**
     * 商品
     */
    private String goods;
    /**
     * 价格
     */
    private double price;

    /**
     * 最终价格
     */
    private double finalPrice;
    /**
     * 描述
     */
    private String desc;


    public BuyGoods(String goods, double price) {
        this.goods = goods;
        this.price = price;
    }

    /**
     * 根据类型计算方法
     * @param discountType 类型
     * @return 最终金额
     */
    public double calculate(String discountType) {
        if ("discount85".equals(discountType)) {
            finalPrice = price * 0.85;
            desc = "该商品可享受8.5折优惠";
        } else if ("discount6".equals(discountType)) {
            finalPrice = price * 0.6;
            desc = "该商品可享受6折优惠";
        } else if ("discount5".equals(discountType)) {
            finalPrice = price >= 5 ? price - 5 : 0;
            desc = "该商品可返现5元";
        } else {
            finalPrice = price;
            desc = "对不起，该商品不参与优惠活动";

        }
        System.out.println(MessageFormat.format("您购买的商品为：{0}，原价为： {1}，{2}，最终售卖价格为：{3}", goods, price, desc, finalPrice));
        return finalPrice;

    }
}
